package data_source.DAO.jdbc;

import java.sql.ResultSet;
import java.sql.SQLException;
import domain.pojo.Medico;
import domain.pojo.Usuario;
import javax.swing.JOptionPane;
import util.DefaultException;
import util.Execucao;

/**
 * Classe que implementa métodos de manipulação de dados de médicos
 * @author Owner
 */
public class MedicoDAO extends GeralDAO{
    /**
     * Define que a tabela que será usada é a de medicos
     */
    public MedicoDAO(){
	super("medico");
    }
    
    /**
     * Pega quantidade de médicos
     * @return quantidade de médicos
     */
    public int getQuantidade(){
	return getCountItem("*");
    }
    
    /**
     * Pega a id de um médico segundo seu nome
     * @param nome nome do médico
     * @return id do médico
     */
    public int getIdNome(String nome){
	return getIntFromItem("id","nome",nome);
    }
    
    /**
     * Pega o nome de um médico segundo sua id
     * @param id id do médico
     * @return nome do médico
     */
    public String getNomeFromID(String id){
	return getStringFromItem("nome","id",id);
    }
    
    /**
     * Pega as especialidades dos médicos
     * @return vetor de strings contendo as especialidades 
     */
    public String[] getEspecialidades(){
	return distinctStrings("especialidade");
    }
    
    /**
     * Pega os nomes dos médicos pertencentes à uma especialidade
     * @param item 
     * @return conjunto contendo os nomes dos médicos pertence à especialidade informada
     */
    public String[] getNomeMedicos(String item){
	return getStringsFromItem("nome","especialidade",item);
    }
    
    public String[] getNomesMedicos(){
	return getNomes();
    }
    
    /**
     * Pega dados de todos os médicos
     * @param quantidade número de médicos
     * @return matriz com os dados dos médicos
     */
    public Object[][] getDados(int quantidade){
	int i;
	Object[][] data = null;
	ResultSet rs = consultALL();
	
	try{
	    data = new Object[quantidade][6];
	    i = 0;
	    while ( rs.next () ){
		data[i][0] = rs.getString("CRM");
		data[i][1] = rs.getString("nome");
		data[i][2] = rs.getString("especialidade");
		data[i][3] = rs.getString("login");
		data[i][4] = rs.getString("senha");
		data[i][5] = rs.getInt("id");
		i++;
	    }
	} catch (SQLException e) {
	    e.printStackTrace();
	}
	return data;
    }
    
    public Medico getMedicoFromNome(String nome){
	Medico data = null;
	ResultSet rs = consultALL();
	
	try{
	    data = new Medico();
	    if ( rs.next () ){
		data.setCRM(rs.getString("CRM"));
		data.setNome(rs.getString("nome"));
		data.setEspecialidade(rs.getString("especialidade"));
		data.setLogin(rs.getString("login"));
		data.setSenha(rs.getString("senha"));
		data.setId(rs.getInt("id"));
	    }
	} catch (SQLException e) {
	    e.printStackTrace();
	}
	return data;
    }
    
    /**
     * Inclui um médico no banco de dados
     * @param medico médico a ser incluído
     * @throws DefaultException
     */
    public void incluir(Medico medico) throws DefaultException{
	String sql = "INSERT INTO medicos (CRM, login, senha, nome, especialidade) "
		   + "VALUES " + "('"+ medico.getCRM()          +"'), '"+
				       medico.getLogin()        +"', MD5('"+
				       medico.getSenha()        +"'), '"+
				       medico.getNome()         +"', '"+
		                       medico.getEspecialidade()+"' )";
	include(sql);
    }
    
    /**
     * Atualiza os dados de um médico presente no banco de dados
     * @param medico médico a ter seus dados atualizados
     * @throws DefaultException
     */
    public void atualizar(Medico medico) throws DefaultException{
	String sql = "UPDATE medicos SET CRM = '" + medico.getCRM() + "', "
					+ "login = '" + medico.getLogin() + "', "
		                        + "senha = '"+ medico.getSenha() + "', "
				        + "nome = '"+ medico.getNome() + "', "
				        + "especialidade = '"+ medico.getEspecialidade() + "' "
				        + "WHERE id = " + medico.getId() + "";
	updateOne(sql);
    }
    
    /**
     * Exclui médico pelo seu id
     * @param id id do médico a ser excluído
     * @throws DefaultException
     */
    public void excluir(int id) throws DefaultException{
	delete("id",String.valueOf(id));
    }
    
    /**
     * Processa login de um médico
     * @param login usuário do médico
     * @param senha senha do médico
     * @return logado com sucesso ou não
     * @throws DefaultException
     */
    public boolean logar(String login, String senha){
	Usuario user = new Usuario();
	
	String sql = "SELECT * FROM medicos WHERE login = ? AND senha = MD5 (?)";
	String[] values = new String[]{login, senha};

	try {
	    ResultSet rs = queryProtect( sql, values );
	    if (rs.next()) {	
		user.setId(rs.getInt("id"));
		user.setLogin(rs.getString("login"));
		user.setSenha(rs.getString("senha"));
		user.setNome(rs.getString("nome"));
		user.setTipo(2);
		Execucao.getInstance(user);
		return true;
	    }
	} catch (SQLException e) {
	    //throw AutenticaoException("erro na consulta..."); 
	}
	return false;
    }
}
